package com.AdvancedDemos.LearnThread多线程;

public class 线程创建方式一 {
    //main方法是由一条默认的主线程负责执行的
    public static void main(String[] args) {
        /**
         * 如何在程序中创建出多条线程?
         * Java是通过java.lang.Thread类的对象来代表线程的。
         * 线程创建方式一:继承Thread类
         * 线程创建方式二:实现Runnable接口
         * 线程创建方式三:实现Callable接口
         */

        /**
         * 多线程的创建方式一:继承Thread类
         *
         * ①定义一个子类MyThread继承线程类java.lang.Thread，重写run()方法
         * ②创建MyThread类的对象
         * ③调用线程对象的start()方法启动线程（启动后还是执行run方法的)
         */

        /**
         * 多线程创建方式一的优缺点:
         * 优点:编码简单
         * 缺点:线程类已经继承Thread,无法继承其他类(Java类不支持多继承)不利于扩展其他功能
         */

        /*
        3.创建MyThread类的对象来代表一个线程
        4.用该对象调用start方法启动线程(自动执行run方法)
         */
        Thread t = new MyThread();
        t.start();//已经实现多线程,main线程+t线程

        for (int i = 0; i < 5; i++) {
            System.out.println("主线程main线程输出" + i);
        }

        //线程间执行先后顺序具有随机性

        //主线程main线程输出0
        //子线程MyThread线程输出0
        //主线程main线程输出1
        //子线程MyThread线程输出1
        //主线程main线程输出2
        //子线程MyThread线程输出2
        //主线程main线程输出3
        //子线程MyThread线程输出3
        //主线程main线程输出4
        //子线程MyThread线程输出4

        //主线程main线程输出0
        //主线程main线程输出1
        //主线程main线程输出2
        //主线程main线程输出3
        //主线程main线程输出4
        //子线程MyThread线程输出0
        //子线程MyThread线程输出1
        //子线程MyThread线程输出2
        //子线程MyThread线程输出3
        //子线程MyThread线程输出4

        //主线程main线程输出0
        //主线程main线程输出1
        //主线程main线程输出2
        //子线程MyThread线程输出0
        //主线程main线程输出3
        //子线程MyThread线程输出1
        //主线程main线程输出4
        //子线程MyThread线程输出2
        //子线程MyThread线程输出3
        //子线程MyThread线程输出4

        /*线程的注意事项
        1、启动线程必须是调用start方法，不是调用run方法。
        如果调用run方法,那么MyThread会被当成普通类,去调用其中的run方法,只会有主线程一条线程;start方法会去向CPU注册线程
        2、不要把主线程任务放在启动子线程之前。
        这样主线程一直是先跑完的，相当于是一个单线程的效果了。
        */

        /*new Thread() {
            @Override
            public void run() {
                System.out.println("可以简写成匿名内部类");
            }
        }.start();*/
    }
}

class MyThread extends Thread {
    /*
    1.让子类继承Thread线程类
    2.必须重写Thread类的run方法
     */
    @Override
    public void run() {
        //run用于描述线程执行的任务
        for (int i = 0; i < 5; i++) {
            System.out.println("子线程MyThread线程输出" + i);
        }
    }
}
